package com.tedu.api.io;

import org.junit.Test;

import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * 解決：File無法實現讀寫操作
 *
 *
 * RandomAccessFile類 隨機訪問文件夾
 * 功能：實現”文件“、文件夾的讀寫操作，底層使用C語言，底層：二進制數據
 *
 * 創建隨機訪問文件類
 * RandomAccessFile  raf=new RandomAccessFile("路徑+文件全稱"，”rw“);
 * RandomAccessFile  raf=new RandomAccessFile("路徑+文件全稱"，”r“);
 * 第二個參數【mode  模式】：r  模式--->文件可以讀操作
 *                        rw 模式-->讀文件可以讀寫操作
 *
 * 需求：實現  cv  複製音樂/視頻
 */
public class RandomAccessFileAPI {
    @Test
    public void testRAF() throws IOException {
        // RandomAccessFile 對象創建出來--路徑+全稱  |模式：”ra“

        RandomAccessFile raf =
                new RandomAccessFile("raf.txt", "rw");
        //1.在API項目文件下  創建  raf.txt  文件，并且實現讀寫操作

        //計算機 識別：二進制  0000 0000
        /**
         * 需要往taf.txt  寫出一個 a 字母
         * write(整數:十進制)  十進制  轉換爲計算機識別二進制
         * 範圍：0~255之間      ASCII碼  二進制  ----十進制----字母
         *                                       97         a
         *                                       98         b
         * 作用：往文件中寫出一個字節，抛出一個IO流的異常：存在寫出失敗情況
         * 1024字節==1KB
         * 1024KB ==1MB
         * 1024MB ==1G
         * 1024G  ==1T
         */
        raf.write(97);  //寫出：一個字節，識別二進制，寫十進制轉二進制
        raf.write(98);
        raf.write(101);
        //write方法--一個字節一個字節寫出
        //關閉流   close()
        raf.close();
    }

    /**
     * read()
     * 作用：讀取一個字節，返回十進制int類型返回，如果文件讀到-1，代表結束
     * 存在IO流異常：讀取可能失敗~
     */
    @Test
    public void testRead() throws IOException {
        //創建對象：隨機訪問文件對象---只讀---raf.txt文件内容
        RandomAccessFile ref =
                new RandomAccessFile("raf.txt", "r");
        int i = ref.read();//  "a"---ASCII碼---97
        int j = ref.read();//  "b"---ASCII碼---98
        int k = ref.read();//  "e"---ASCII碼---101
        int y = ref.read();//  -1代表數據沒有了
        System.out.println(i + "" + j + "" + k + "" + y);
    }

    /**
     * RAF類---構造器：讀寫操作--
     * -write(數值)  read() 一個字節一個字節寫出以及讀入
     * 需求：複製粘貼一個音樂  【Version 1 -- 不考慮效率 】
     *
     */
    @Test
    public void testCV() throws IOException {
        //1.源文件--”小跳蛙.mp3“---複製---操作：讀入
        RandomAccessFile src = new RandomAccessFile("小跳蛙.mp3", "r");

        //2.複製文件--”新跳蛙.mp3“--粘貼--操作：寫出
        RandomAccessFile desc = new RandomAccessFile("小跳蛙.mp3", "rw");
        //3.用於保存讀取到的字節
        int data = -1;
        //4.一直從”小跳蛙.MP3“中一個字節一個字節讀取---[true]
        //同時一個字節一個字節寫出”新跳蛙.mp3“
        //(data=src.read())!=-1   條件判斷語句[true]

        long start= System.currentTimeMillis();
        //獲取當前系統時間毫秒數

        while ((data = src.read()) != -1) {//一個字節一個字節--讀
            //同時一個字節一個字節寫出”新跳蛙.mp3“

            desc.write(data);

        }
        long end = System.currentTimeMillis();
        System.out.println("複製粘貼花費多少：" + (end - start) + "毫秒");

    }
    /**
     * 需求：复制粘贴一个音乐  【Version 1--考虑效率】
     * 一个字节一个字节的读取----一个字节一个字节写出【慢】
     * 100KB读取----一100KB写出    【快】
     */
    @Test
    public void testCVS() throws IOException {
        //1.从“小跳蛙.mp3”读取数据【100KB】
        RandomAccessFile src=
                new RandomAccessFile("小跳蛙.mp3","r");
        //2.从API的目录下写出“效率高.mp3”--写出数据【100KB】
        RandomAccessFile desc=
                new RandomAccessFile("效率高.mp3","rw");
        //3.保存每次读取字节量：①覆盖：保存读写数据，保障数据稳定
        //                   ②没有数据：表示文件读取到末尾
        int len=-1;
        //4.效率：100KB    字节byte
        byte[] data=new byte[1024*100];  //100KB
        //5.一直  从src文件中读取数据：100KB  |  read(byte[] b) 读100KB
        //5.1   src.read()  从src"小跳蛙.mp3" 一个字节一个字节读
        //5.2   src.read(byte[] date)   从src"小跳蛙.mp3"   100KB的读
        //5.3   len=src.read(byte[] data)   保存从src"小跳蛙.mp3"100KB的读
        //5.4   (len=src.read(byte[]  data))!=-1
        //      将读到的100KB的字节数据保存len中，只要不等于-1，没有读完，一直读
        long start= System.currentTimeMillis();
        while ((len=src.read(data))!=-1){
            //同时，读取文件同时，写出数据 “效率高.mp3”文件
            // write(整数)  写出一个字节【慢】
            //write(字节数组，0，-1)  写出字节数组指定的单位量【例：100KB】
            desc.write(data,0,len);
        }
        long end=System.currentTimeMillis();
        System.out.println("100KB复制版本："+(end-start)+"毫秒数");
    }


}
